﻿using System;
using System.Windows.Forms;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using RainEngine.Controllers;

namespace RainEngine
{

    /***********************************************************************************
     *  这个部分类只包含用于编辑器的支持Windows.Forms的代码
     ***********************************************************************************/

    /// <summary>
    /// 引擎主类
    /// </summary>
    public partial class RainGE : Game
    {

#if !XBOX 
        /// <summary>
        /// 用于绘制XNA图像的Windows.Forms.Control控件，通常是一个panel控件
        /// </summary>
        protected Control winControl;

        /// <summary>
        /// 用于绘制的Windows.Forms.Form窗体
        /// </summary>
        protected Form winForm;        

        /// <summary>
        /// XNA框架的游戏窗口
        /// </summary>
        private Form gameWindowForm;        
#endif

#if !XBOX
       
        //==========================================================================

        /// <summary>
        /// 使用IWinForm接口为参数创建一个新引擎对象。 
        /// 不要创建这个类的示例，而是应该从这个类继承。
        /// StunXnaGE派生自Microsoft.Xna.Framework.Game，使用方法与Game对象相同。
        /// IWinForm接口使用GraphicsDevice.Present(handle)将绘制重定向到windows窗体的某个控件。
        /// </summary>
        /// <param name="form">IWinForm接口，实现了对winForm和winControl的引用</param>        
        public RainGE(IWinForm form)
            : this()
        {
            if (form != null)
            {
                this.winForm = form.Form;
                this.winControl = form.winControl;
                
                // 添加一些处理事件
                this.winForm.FormClosing += new FormClosingEventHandler(winForm_FormClosing);
                this.winControl.Resize += new EventHandler(winControl_Resize);
            }
        }

        /// <summary>
        /// 如果使用Winform窗体，则将显示重新定向到一个窗体控件中
        /// </summary>
        /// <param name="gameTime"></param>
        protected override void Draw(GameTime gameTime)
        {
            base.Draw(gameTime);

            // 绘制光标
            SpriteBatch.Begin();
            if (scm.isShowMouseCursor)
                SpriteBatch.Draw(cursor, new Rectangle(Input.MousePos.X, Input.MousePos.Y, 32, 32), Color.White);
            SpriteBatch.End();  

            if (winControl != null)
                GraphicsDevice.Present(null,null,winControl.Handle);
        }

        /// <summary>
        /// 处理主窗体的Closing事件
        /// </summary>
        void winForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 如果主窗体关闭则退出程序
            this.Exit();
        }

        /// <summary>
        /// 根据WinForm绘制控件的大小重新设置图形设备的大小。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void winControl_Resize(object sender, EventArgs e)
        {
            Control c = (Control)sender;
            if (c != null)
            {
                Graphics.PreferredBackBufferHeight = c.ClientSize.Height > 0 ? c.ClientSize.Height : 2;
                Graphics.PreferredBackBufferWidth = c.ClientSize.Width > 0 ? c.ClientSize.Width : 2;
                Graphics.ApplyChanges();        
            }
        }

        /// <summary>
        /// 在Windows.Forms环境中不需要XNA游戏窗口，所以将它隐藏
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gameWindowForm_Shown(object sender, EventArgs e)
        {
            this.gameWindowForm.Hide();
            winControl_Resize(winControl, null);
        }    

#endif
    }
}
